AhaWiki는 성능 최적화를 위해 여러 계층의 캐싱 메커니즘을 사용합니다.
캐싱 메커니즘 | 유형 | 저장소 | TTL / 주기 | 비고 |
|---|---|---|---|---|
AhaWikiCache | 분산 캐시 | Redis / Memcached | 항목별 상이 | SWR + Single-Flight 패턴 |
AhaWikiCacheMemoryDomainSite | 인-메모리 | ConcurrentHashMap | 1시간 주기 갱신 | 도메인-사이트 매핑 |
AhaWikiCacheMemoryApiLinks | 인-메모리 | ConcurrentHashMap | 10분 주기 초기화 | 최대 2,000 항목 |
AhaWikiCacheMemoryPermission | 인-메모리 | ConcurrentHashMap | 6시간 주기 초기화 | 사이트별 권한 목록 |
AhaWikiCacheMemorySiteAdmin | 인-메모리 | ConcurrentHashMap | 6시간 주기 초기화 | 사이트별 관리자 목록 |
CacheCrawler | DB 캐시 | MySQL | 180일 TTL | 외부 URL 메타데이터 |
InterpreterVim | 파일 캐시 | cache/Vim/ | 7일 주기 초기화 | Vim 문법 강조 결과 |
app/logics/AhaWikiCache.scala
Play Framework의 SyncCacheApi를 사용하는 분산 캐시 계층입니다. Redis 또는 Memcached 백엔드를 지원합니다.
TTL이 만료된 뒤에도 TTL × 6 또는 최소 60초까지는 만료된 값을 즉시 반환합니다. 그 사이 백그라운드에서 값을 갱신합니다. SWR 기간도 초과하면 실시간 계산 후 저장합니다.
동일 캐시 키에 대한 동시 요청이 들어올 때 한 번만 계산합니다. synchronized 블록으로 구현합니다.
logics.AhaWikiCache$Header:{site.seq}.header 페이지 렌더링 결과 (HTML 문자열)invalidateSiteCaches() 호출 시logics.AhaWikiCache$Config:{site.seq}.config 페이지 내용 (설정 저장소)invalidateSiteCaches() 호출 시logics.AhaWikiCache$UserProfileImageUrl:{site.seq}:{nickname}logics.AhaWikiCache$PageMeta$SeqPageLatestSummary:{site.seq}invalidateSiteCaches() 호출 시logics.AhaWikiCache$PageMeta$SeqPageName:{site.seq}invalidateSiteCaches() 호출 시다음 항목을 한번에 무효화합니다.
AhaWikiCacheMemoryDomainSitePageMeta.SeqPageLatestSummaryPageMeta.SeqPageNameHeaderFooterConfigapp/logics/AhaWikiCacheMemoryDomainSite.scala
도메인 이름 → Site 객체 매핑을 인-메모리에 유지합니다. 모든 HTTP 요청마다 도메인으로 사이트를 조회하므로 DB 조회 없이 처리합니다.
@volatile + synchronized 블록app/logics/AhaWikiCacheMemoryApiLinks.scala
페이지 간 링크 관계(인접 링크)를 캐싱합니다. 링크 계산은 비용이 크므로 결과를 재사용합니다.
(siteSeq, pageName)Seq[CalculatedLink]app/logics/AhaWikiCacheMemoryPermission.scala
사이트별 Permission 테이블 전체를 메모리에 유지합니다. 권한 판정은 모든 요청에서 수행되므로 DB 조회를 줄입니다.
siteSeqSeq[Permission]app/logics/AhaWikiCacheMemorySiteAdmin.scala
사이트별 관리자(SiteAdmin) 목록을 메모리에 유지합니다.
siteSeqSet[Long] (user.seq 집합)app/models/tables/CacheCrawler.scala
외부 URL의 제목, 이미지, 설명을 DB에 저장합니다. 동일 URL에 대한 반복 크롤링을 방지합니다.
상태 | 조건 | 처리 |
|---|---|---|
Fresh | 갱신 후 90일 이내 | 즉시 캐시 반환 |
Stale | 90일 초과 ~ 180일 이내 | 캐시 반환 후 백그라운드 재검증 |
Expired | 180일 초과 | 삭제 대상 |
12시간마다 만료된(Expired) 항목을 DB에서 삭제합니다.
app/logics/wikis/interpreters/InterpreterVim.scala
Vim을 사용한 문법 강조(syntax highlight) 결과를 파일 시스템에 저장합니다. Vim 프로세스 실행 비용을 절감합니다.
cache/Vim/MD5(colorscheme + 원본 코드){md5}.html (최종 HTML)app/logics/AhaWikiCacheMemoryTrieMap.scala
위 메모리 캐시들의 기반 구조입니다. ConcurrentHashMap을 감싸며 최대 크기를 지원합니다.
ConcurrentHashMap 위임app/services/ApplicationLifecycleHook.scala
스케줄명 | 초기 지연 | 반복 간격 | 동작 |
|---|---|---|---|
SiteDomainCacheRefresh | 5초 | 1시간 | 도메인-사이트 캐시 전체 갱신 |
ApiLinksCacheClear | 10분 | 10분 | 링크 캐시 전체 삭제 |
PermissionCacheClear | 6시간 | 6시간 | 권한 캐시 전체 삭제 |
SiteAdminCacheClear | 6시간 | 6시간 | 관리자 캐시 전체 삭제 |
CacheFileCleanup | 15초 | 7일 | Vim 파일 캐시 정리 |
CrawlerCacheCleanup | 10초 | 12시간 | 만료된 크롤러 캐시 DB 삭제 |
Similar pages by cosine similarity. Words after page name are term frequency.